package chen;


/**
 * 仅实现了acquire
 * */
public class SimpleAQS2 {
    //表示头元素
    private volatile Node head;
    //表示尾元素
    private volatile Node tail;
    //status为1表示锁被占用，0表示锁空闲
    private volatile int status;

    public final void acquire(int arg) {
        /**
         * 1. 如果tryAcquire返回true, 则说明已经获取到锁, 则不执行后面的程序 (创建队列, 创建Node元素, 排队)
         * 2. 如果tryAcquire返回false, 则说明锁被占用, 则执行后面的程序进行排队
         * */


        if (!tryAcquire(arg) && acquireQueued(addWaiter(), arg)) {
            Thread.currentThread().interrupt(); // 自我中断
        }

    }

    /*
    * 判断传入的Node是否需要排队, 如果需要排队, 则开始排队, 不需要排队则直接获取锁
    * @author GangsterChen
    * @date 2021/3/22 19:06
    * @param [node, arg]
    * @return 如果排队成功,(线程开始等待) 返回ture,如果没有等待, 则返回false
    */
    private boolean acquireQueued(Node node, int arg) {
        return false;
    }

    /*
    * 根据当前线程, 创建一个Node对, 且将该对象放入队列
    * @author GangsterChen
    * @date 2021/3/22 19:05
    * @param []
    * @return []
    */
    private synchronized Node addWaiter() {
        return null;
    }

    /*
    * 尝试获取锁
    * @author GangsterChen
    * @date 2021/3/22 19:03
    * @param [arg]
    * @return 如果获取到锁, 返回ture 反之false
    */
    private boolean tryAcquire(int arg) {
        return false;
    }

    /*
    * 节点类
    * @author GangsterChen
    * @date 2021/3/22 19:05
    * @param
    * @return
    */
    private static class Node {
        Node prev;//指向上一个元素
        Node next;//指向下一个元素
        Thread thread;//当前元素中的线程对象
        int status;//当前线程的状态
        // 定义几个状态常量
        static final int DEFAULT = 0;
        static final int WAIT = 1;
        static final int CANCELLED = -1;

        //准备几个构造方法
        public Node() {
        }

        public Node(Thread thread) {
            this.thread = thread;
        }

        public Node(Thread thread, int status) {
            this.thread = thread;
            this.status = status;
        }
    }
}
